package learn.stream;

import java.util.List;
import java.util.Optional;
import java.util.OptionalInt;
import java.util.Random;
import java.util.stream.Collectors;
import java.util.stream.Stream;

/**
 * Created By  醉美柳舞之众星捧月
 *
 * @author song
 * @date 2018/12/27 15:40
 */
public class StreamDemo4 {
    public static void main(String[] args) {
        String str = "my name is 007";
        /** ************************ forEach   forEachOrdered ******************************************* **/
        /** 使用并行流 **/
        str.chars().parallel().forEach(i -> System.out.print((char) i));
        System.out.println();
        /** 使用 forEachOrdered 保证顺序 **/
        str.chars().parallel().forEachOrdered(i -> System.out.print((char) i));
        System.out.println();

        /** *************************** collect  to Array********************************************** **/

        /** 收集到list **/
        List<String> collect = Stream.of(str.split(" ")).collect(Collectors.toList());
        System.out.println(collect);

        /** ********************************** reduce ************************************ **/
        /** 把一个流,合成一个数据 || 拼接字符串**/  /**  这种字符串的拼接返回一个Optional,可以调用Optional的方法来操作 **/
        Optional<String> reduce = Stream.of(str.split("")).reduce((s1, s2) -> s1 + "|" + s2);
        System.out.println(reduce.orElse(""));

        /** 带初始化值的reduce 是直接返回一个String **/
        String string = Stream.of(str.split(" ")).reduce("", (s1, s2) -> s1 + "|" + s2);
        System.out.println(string);

        /** 带初始值的其他操作;eg ： 计算所有单词的总长度**/
        Integer length = Stream.of(str.split(" ")).map(s -> s.length()).reduce(0, (s1, s2) -> s1 + s2);
        System.out.println(length);

        /** ************************************** min  max  count ********************************** **/
        /** 返回出集合中单词长度最长的 **/
        Optional<String> max = Stream.of(str.split(" ")).max((s1, s2) -> s1.length() - s2.length());
        System.out.println(max.get());

        /** 短路操作----------------------------------------------------------------- **/
        OptionalInt first = new Random().ints().findFirst();
        System.out.println(first.getAsInt());
    }
}
